package com.example.project.service.impl;

import com.example.project.entity.File;
import com.example.project.dao.FileDao;
import com.example.project.service.FileService;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;

import javax.annotation.Resource;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * (File)表服务实现类
 *
 * @author makejava
 * @since 2024-02-23 15:18:23
 */
@Service("fileService")
public class FileServiceImpl implements FileService {
    @Resource
    private FileDao fileDao;

    /**
     * 通过ID查询单条数据
     *
     * @param fileId 主键
     * @return 实例对象
     */
    @Override
    public File queryById(Integer fileId) {
        return this.fileDao.queryById(fileId);
    }

    /**
     * 分页查询
     *
     * @param file 筛选条件
     * @param pageRequest      分页对象
     * @return 查询结果
     */
    @Override
    public Page<File> queryByPage(File file, PageRequest pageRequest) {
        long total = this.fileDao.count(file);
        return new PageImpl<>(this.fileDao.queryAllByLimit(file, pageRequest), pageRequest, total);
    }

    /**
     * 新增数据
     *
     * @param file 实例对象
     * @return 实例对象
     */
    @Override
    public File insert(File file) {
        this.fileDao.insert(file);
        return file;
    }

    /**
     * 修改数据
     *
     * @param file 实例对象
     * @return 实例对象
     */
    @Override
    public File update(File file) {
        this.fileDao.update(file);
        return this.queryById(file.getFileId());
    }

    /**
     * 通过主键删除数据
     *
     * @param fileId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer fileId) {
        boolean flag = false;
        File file = new File();
        file=this.fileDao.queryById(fileId);
        String filePath=file.getFilePath();
        //根据路径创建文件对象
        java.io.File fileIO = new java.io.File(filePath);
        //路径是个文件且不为空时删除文件
        if(fileIO.isFile() && fileIO.exists()){
            flag = fileIO.delete();
            if (!flag){
                return flag;
            }
            flag = this.fileDao.deleteById(fileId) > 0;
        }
        return flag;
    }

    @Override
    public File update1(File data) {
        File oldFile = this.fileDao.queryId(data);
        if (oldFile == null){
            return this.update(data);
        }
        this.deleteById(oldFile.getFileId());
        return this.update(data);
    }

    @Override
    public List<File> queryBy(File data) {
        List<File> fileList = this.fileDao.queryAllBy(data);
        return fileList;
    }

    @Override
    public ResponseEntity<byte[]> download(File data) throws IOException {
        File myFile = this.fileDao.queryById(data.getFileId());
        // 从本地文件系统中读取文件
        Path filePath = Paths.get(myFile.getFilePath());
        Resource resource = (Resource) new FileSystemResource(filePath.toFile());

        // 读取文件内容
        byte[] fileContent = Files.readAllBytes(filePath);

        // 设置响应头，指定文件名并返回文件内容
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", filePath.getFileName().toString());

        return new ResponseEntity<>(fileContent, headers, HttpStatus.OK);
    }

}
